GetProcessMemoryInfo (psapi)
Last changed: -93.61.102.184

.
Summary
Reads a process memory usage

C# Signature:

[DllImport("psapi.dll", SetLastError=true)]
static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS counters, uint size);

VB Signature:

Declare Function GetProcessMemoryInfo Lib "psapi.dll" (TODO) As TODO

User-Defined Types:

[StructLayout(LayoutKind.Sequential, Size=40)]
private struct PROCESS_MEMORY_COUNTERS
{
    public uint cb;
    public uint PageFaultCount;
    public uint PeakWorkingSetSize;
    public uint WorkingSetSize;
    public uint QuotaPeakPagedPoolUsage;
    public uint QuotaPagedPoolUsage;
    public uint QuotaPeakNonPagedPoolUsage;
    public uint QuotaNonPagedPoolUsage;
    public uint PagefileUsage;
    public uint PeakPagefileUsage;
}

//simpler, but 32 bit only

[StructLayout(LayoutKind.Sequential, Size=40)]
private struct PROCESS_MEMORY_COUNTERS
{
    public uint cb;
    public uint PageFaultCount;
    public int PeakWorkingSetSize;
    public int WorkingSetSize;
    public int QuotaPeakPagedPoolUsage;
    public int QuotaPagedPoolUsage;
    public int QuotaPeakNonPagedPoolUsage;
    public int QuotaNonPagedPoolUsage;
    public int PagefileUsage;
    public int PeakPagefileUsage;
}

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

   [DllImport("kernel32.dll")]
   private static extern IntPtr GetCurrentProcess();

   [StructLayout(LayoutKind.Sequential, Size = 40)]
   private struct PROCESS_MEMORY_COUNTERS
   {
      public uint cb;             // The size of the structure, in bytes (DWORD).
      public uint PageFaultCount;         // The number of page faults (DWORD).
      public uint PeakWorkingSetSize;     // The peak working set size, in bytes (SIZE_T).
      public uint WorkingSetSize;         // The current working set size, in bytes (SIZE_T).
      public uint QuotaPeakPagedPoolUsage;    // The peak paged pool usage, in bytes (SIZE_T).
      public uint QuotaPagedPoolUsage;    // The current paged pool usage, in bytes (SIZE_T).
      public uint QuotaPeakNonPagedPoolUsage; // The peak nonpaged pool usage, in bytes (SIZE_T).
      public uint QuotaNonPagedPoolUsage;     // The current nonpaged pool usage, in bytes (SIZE_T).
      public uint PagefileUsage;          // The Commit Charge value in bytes for this process (SIZE_T). Commit Charge is the total amount of memory that the memory manager has committed for a running process.
      public uint PeakPagefileUsage;      // The peak value in bytes of the Commit Charge during the lifetime of this process (SIZE_T).
   }

   [DllImport("psapi.dll", SetLastError = true)]
   static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS counters, uint size);

   ...

   IntPtr currentProcessHandle = GetCurrentProcess();
   PROCESS_MEMORY_COUNTERS memoryCounters;
   unsafe
   {
      memoryCounters.cb = (uint) sizeof (PROCESS_MEMORY_COUNTERS);
   }
      if (GetProcessMemoryInfo(currentProcessHandle, out memoryCounters, memoryCounters.cb))
      {
     // Work with memoryCounters
     ...
      }

   // TODO: Throw a dedicated exception
   throw new Exception("GetProcessMemoryInfo returned false. Error Code is " +
      Marshal.GetLastWin32Error());